SpringMVC 中 jdbcTemplate.queryForList 返回结果 封装成 实体 对象

在调用 jdbcTemplate.queryForLis方法时,返回的结果类似于{id=xx...}{id=xx...}{id=xx...},这时我们通常希望是直接返回对象的集合,这时我们可以将结果先转成map,贴一段实例代码:

List<?> queryList = jdbcTemplate.queryForList(sql.toString(), values);
        List<User> dtoList = new ArrayList<User>();
        for (int i = 0; i < queryList.size(); i++) {
            Map<String, Object> map = (Map<String, Object>) queryList.get(i);
            User user = (User) DtoReflectionSqlUtil.getDtoObject(map, cls);
            dtoList.add(user );
        }
 pageInfo.setResult(dtoList);

===========================================

DtoReflectionSqlUtil.getDtoObject(xx,xx)这是一个工具方法,作用在于将map转化成对应的实体对象返回回来,主要思路是通过反射去调用实体对象里面每个字段的setXxxx()方法,将map里面的值取出来set到对象里,然后返回对象。实现如下:

public static Object getDtoObject(Map<String, Object> map, Class<?> cls) throws Exception {
        Constructor<?> ct = cls.getConstructor();
        Object retobj = ct.newInstance();
        Class<?> supClass = cls.getSuperclass();
        Method[] ms = cls.getDeclaredMethods();
        if (!"java.lang.Object".equals(supClass.getName())) {
            Method[] supms = supClass.getDeclaredMethods();
            ms = (Method[]) ArrayUtils.addAll(ms, supms);
        }
        for (int i = 0; i < ms.length; i++) {
            Method m = ms[i];
            Class<?> pts[] = m.getParameterTypes();
            if (m.getReturnType().toString().equals("void")) {
                Object value = map.get(m.getName().replaceAll("set", "").toUpperCase());
                if (value != null) {
                    if (pts[0] == String.class) {
                        m.invoke(retobj, new Object[] { value.toString() });
                    } else if (pts[0] == Integer.class||pts[0] == int.class) {
                        m.invoke(retobj, new Object[] { Integer.parseInt(value.toString()) });
                    } else if (pts[0] == Long.class||pts[0] == long.class) {
                        m.invoke(retobj, new Object[] { Long.parseLong(value.toString()) });
                    } else if (pts[0] == Double.class||pts[0] == double.class) {
                        m.invoke(retobj, new Object[] { Double.parseDouble(value.toString()) });
                    } else if (pts[0] == Calendar.class) {
                        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(format.parse(value.toString()));
                        m.invoke(retobj, new Object[] { calendar });
                    }else if (pts[0] == BigDecimal.class) {
                        m.invoke(retobj, new Object[] { value });
                    }
                } else {
                    if (pts[0] == Integer.class) {
                        m.invoke(retobj, new Object[] { 0 });
                    } else if (pts[0] == Long.class) {
                        m.invoke(retobj, new Object[] { 0L });
                    } else if (pts[0] == Double.class) {
                        m.invoke(retobj, new Object[] { 0.00 });
                    }
                }
            }
        }
        return retobj;
    }

如此一来,便可以将jdbcTemplate.queryForLis()返回的值转换成相对应的对象集合,以便使用。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值